package com.dabai.iot.core.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dabai.common.core.enums.YnEnum;
import com.dabai.common.mybatis.core.page.TableDataInfo;
import com.dabai.iot.core.dto.DeviceQuery;
import com.dabai.iot.core.entity.DeviceEntity;
import com.dabai.iot.core.entity.ProductTopicEntity;
import com.dabai.iot.core.model.MqttLinkInfo;
import com.dabai.iot.core.vo.DeviceSelectVO;
import com.dabai.iot.core.vo.DeviceVO;
import com.dabai.iot.core.vo.HomeLineVO;
import lombok.NonNull;

import java.time.LocalDate;
import java.util.List;

/**
 * 设备 Service 接口
 *
 * @author kev1n
 */
public interface IDeviceService extends IService<DeviceEntity> {

    /**
     * 新增
     */
    boolean addDevice(DeviceEntity device);

    /**
     * 修改
     */
    boolean updateDevice(DeviceEntity device);

    /**
     * 删除
     */
    boolean removeDevice(Long id);

    /**
     * 设备详情
     */
    DeviceVO detailById(@NonNull Long id);

    /**
     * 设备列表分页
     */
    IPage<DeviceVO> getDevicePage(IPage<DeviceEntity> page, DeviceQuery deviceQuery);

    /**
     * 按设备分组返回设备列表分页
     */
    IPage<DeviceVO> getDevicePageByGroup(IPage<DeviceEntity> page, Long groupId, DeviceQuery deviceQuery);

    /**
     * 设备下拉数据源
     */
    List<DeviceSelectVO> select(DeviceQuery deviceQuery);

    /**
     * 获取设备信息
     */
    DeviceEntity getDeviceById(Long deviceId);

    /**
     * 获取设备信息
     */
    DeviceEntity getDeviceCacheById(Long deviceId);

    /**
     * 设备实体缓存
     */
    DeviceEntity getDeviceCacheBySn(@NonNull String productKey, @NonNull String deviceSn);

    /**
     * 主题分页
     */
    TableDataInfo<ProductTopicEntity> getTopicPage(IPage<ProductTopicEntity> page, @NonNull Long deviceId, @NonNull String topicSourceType, String topicDirection);

    /**
     * 设置设备在线状态
     *
     * @param id 设备主键
     * @return
     */
    boolean setOnlineStatus(@NonNull Long id, @NonNull YnEnum isOnline);

    /**
     * 设置设备在线状态
     */
    void setDeviceStatus(@NonNull DeviceEntity device);

    /**
     * 获取指定日期的注册设备数量
     */
    List<HomeLineVO> getDeviceCountByCreateDate(String tenantId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取设备 MQTT 连接参数
     *
     * @param deviceId 设备主键id
     */
    MqttLinkInfo getMqttLinkInfo(Long deviceId);

}
